1 module unde.games.dizzy.omega.scene_loader; 2 3 import core.memory; 4 import std.concurrency; 5 import std.datetime; 6 import std.stdio; 7 import std.string; 8 import unde.games.collision_detector; 9 import unde.games.obj_loader; 10 11 private bool scene_load(ref shared ObjFile*[SC] screens, 12 ref immutable string[SC] screen_names, 13 int X, int Y) 14 { 15 if (SC(X,Y) in screen_names && SC(X,Y) !in screens) 16 { 17 screens[SC(X,Y)] = 18 cast (shared) load_objfile(format("models/screen_%02d_%02d.obj", X, Y)); 19 } 20 21 return (SC(X,Y) in screen_names) !is null; 22 } 23 24 25 private void scene_loader_iteration(ref shared ObjFile*[SC] screens, 26 ref immutable string[SC] screen_names, 27 int X, int Y, int L) 28 { 29 scene_load(screens, screen_names, X, Y); 30 scene_load(screens, screen_names, X-1, Y); 31 if ( !scene_load(screens, screen_names, X, Y-1) ) 32 scene_load(screens, screen_names, X, Y-2); 33 scene_load(screens, screen_names, X+1, Y); 34 if ( !scene_load(screens, screen_names, X, Y+1) ) 35 scene_load(screens, screen_names, X, Y+2); 36 37 bool collect; 38 while (screens.length > L) 39 { 40 foreach(sc; screens.keys()) 41 { 42 if (sc != SC(X, Y) && 43 sc != SC(X-1, Y) && 44 sc != SC(X, Y-1) && 45 sc != SC(X+1, Y) && 46 sc != SC(X, Y+1) && 47 sc != SC(X, Y-2) && 48 sc != SC(X, Y+2)) 49 { 50 screens.remove(sc); 51 collect = true; 52 break; 53 } 54 } 55 } 56 57 if (collect) GC.collect(); 58 } 59 60 void 61 scene_loader(shared ObjFile*[SC] *screens, 62 immutable string[SC] *screen_names, 63 int X, int Y, int L, Tid tid) 64 { 65 try { 66 bool finish; 67 do 68 { 69 scene_loader_iteration(*screens, 70 *screen_names, X, Y, L); 71 receiveTimeout( 100.msecs, 72 (int x, int y) 73 { 74 X = x; 75 Y = y; 76 }, 77 (bool a) { 78 finish = a; 79 }, 80 (OwnerTerminated ot) { 81 writefln("Abort scene_loader due stopping parent"); 82 finish = true; 83 } ); 84 } 85 while (!finish); 86 } catch (shared(Throwable) exc) { 87 send(tid, exc); 88 } 89 90 writefln("Finish scene loader"); 91 //send(tid, thisTid); 92 }